<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // new 运算符；
      // 面向过程  面向对象
      // 类和对象
      // 对象如何创建  ，类如何创建
      // js里的类  ： 工厂模式 生产对象---》没有公共空间---》构造函数 ：1.有公共空间prototype 2.通过new来执行函数；

      // 工厂模式
      // function Person(name){
      //     let obj = {};
      //     obj.name = name;
      //     obj.fn = function(){
      //         console.log("fn");
      //     }
      //     return obj;
      // }

      // // function Person(name){
      // //     return {
      // //         name:name,
      // //         fn(){
      // //         console.log("fn")
      // //         }};
      // // }
      // let zhangsan = Person("张三");
      // let lisi = Person("李四");

      // 构造函数  ：也是普通的函数 ，通过new 来执行函数；

      // new 来执行函数 ：1，创建一个空对象  2. 把空对象和this绑定  3.隐式返还这个对象 4.可以执行函数

      // function test(){
      //     console.log("test、。。。。");
      // }

      // function Person(name){
      //     let obj = {};
      //     obj.name = name;
      //     obj.fn = function(){
      //         console.log("fn");
      //     }
      //     return obj;
      // }

      // test();
      // new test;  //通过new来执行函数
      function Person(name) {
        this.name = name;
        this.fn = function () {
          console.log("fn");
        };
      }

      // 1，创建一个空对象  2. 把空对象和this绑定  3.隐式返还这个对象 4.可以执行函数
      function myNew(fn, name) {
        let obj = {}; //创建一个空对象
        Person.call(obj, name); //执行函数 且 把空对象和函数内的this绑定
        return obj; //返还这个对象；
      }

      let zhangsan = myNew(Person, "张三");
      let lisi = myNew(Person, "李四");
      console.log(zhangsan, lisi);

      let zhangsan2 = new Person("张三"); // new 叫实例化 new之后就得到对象；
      let lisi2 = new Person("李四");
      console.log(zhangsan2, lisi2);
    </script>
  </body>
</html>
